Disjoint Set
ย - Last update: 2023-06-17

MST์˜ ํฌ๋ฃจ์Šค์นผ๊ณผ ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ด๋Š” Disjoint Set์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ •๋ฆฌ

Implementation Overview

struct DisjointSet {
int parent[SIZE];
int rank[SIZE];
void init() {
for(int i = 0; i < SIZE; ++i) {
parent[i] = i;
rank[i] = 0;
}
}
int getRoot(int v) {
if (v == parent[v]) return v;
return parent[v] = getRoot(parent[v]);
}
void merge(int a, int b) {
int a = getRoot(a);
int b = getRoot(b);
if (a == b) return; // already merged
parent[b] = a;
}
};

Time Complexity

๋ธ”๋กœ๊ทธ๋‚˜ ์ฑ… ์ฐพ์•„๋ณด๋ฉด Rank์™€ Path Compression์„ ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•˜๋ฉด ์• ์ปค๋งŒ ํ•จ์ˆ˜๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฑฐ์˜ O(1)O(1)๊ณผ ์œ ์‚ฌํ•œ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋‚˜์˜จ๋‹ค๊ณ  ํ•˜์ง€๋งŒ, ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ Path Compression๋งŒ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋„ O(logโกn)O(\log n)์ด ๋ณด์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ •๋„๋งŒ ํ•ด๋‘ฌ๋„ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์–ด์ฐจํ”ผ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ•ฉ์ณ์„œ ์“ธ ๊ฒƒ์ธ๋ฐ(Union Find ๋งŒ์œผ๋กœ ๋œ ๋ฌธ์ œ๋Š” ์ž˜ ์—†์œผ๋ฏ€๋กœ..), ์ด ๊ฒฝ์šฐ์— O(logโกn)O(\log n)์€ ์–ด์ฐจํ”ผ base์— ๊ฐ€๊นŒ์šด ์‹œ๊ฐ„๋ณต์žก๋„์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ๊นŒ์ง€ ์ค„์ผ ํ•„์š”๋Š” ์—†๋‹ค๊ณ  ๋ณธ๋‹ค.

๐Ÿท๏ธ ์ฃผ์ œ ๋ชฉ๋ก: